package com.yuyunbo.es.restclient;

import com.yuyunbo.es.restclient.vo.EsQueryBaseVO;
import com.yuyunbo.es.restclient.vo.EsScrollQueryResponse;
import com.yuyunbo.es.restclient.vo.PageBean;

import java.util.List;

/**
 * @Author: yuyunbo-1154363414@qq.com
 * @Date: 2019/1/25 14:17
 * @Description:
 */
public interface EsApiService {


    /**
     * 根据基类获取 推送ES模型类
     * @param dataModel
     * @param <T>
     * @return
     */
    <T> EsModel<T> getPutEsModel(T dataModel);


    /**
     * 根据基类获取 查询ES模型类
     * @param esQueryBaseVO
     * @param <T>
     * @return
     */
    <T> EsModel<T> getSerachEsModel(EsQueryBaseVO esQueryBaseVO, int page, int pageSize);


    /**
     *  分页查询
     * @param <T>
     * @return
     */
    <T> PageBean<T> getPageBean(EsModel<T> esModel, Class<T> requiredType);

    /**
     * 单个提交保存到ES
     * @param esModel
     * @param <T>
     */
    <T>  void putToEs(EsModel<T> esModel);


    /**
     * 查询List 集合
     * @param esModel
     * @param <T>
     * @return
     */
    <T> List<T> queryList(EsModel<T> esModel, Class<T> requiredType);

    /**
     * 统计数据条数
     * @param esModel
     * @param <T>
     * @return
     */
    <T> int queryCount(EsModel<T> esModel);


    /**
     * 批量提交保存到ES
     * @param esModel
     * @param <T>
     */
    <T>  void batchPutToEs(EsModel<T> esModel);

    /**
     * Scroll 查询数据 第一次查询
     * @param esModel
     * @param aliveSeconds
     * @param requiredType
     * @param <T>
     * @return
     */
    <T> EsScrollQueryResponse<T> openScrollSearch(EsModel<T> esModel, int aliveSeconds, Class<T> requiredType);

    /**
     * Scroll 查询数据 非第一次查询
     * @param scrollId
     * @param aliveSeconds
     * @param requiredType
     * @param <T>
     * @return
     */
    <T> EsScrollQueryResponse<T> searchByScrollId(String scrollId, int aliveSeconds, Class<T> requiredType);
}
